/**
 * 汽车时速表 - 基于LVGL的简化版本（无SDL依赖）
 * 
 * 功能特性：
 * - 圆形仪表盘设计
 * - 实时指针动画
 * - 数字显示
 * - 档位指示
 * - 警告指示灯
 * - 模拟运行模式
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <string.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

#include "lvgl/lvgl.h"

// 禁用SDL支持，使用简化模式
#define USE_SDL 0

// 配置常量
#define DISP_HOR_RES    800
#define DISP_VER_RES    600
#define MAX_SPEED       220
#define SPEED_STEP      2
#define UPDATE_PERIOD   50  // 50ms更新间隔

// 简化版本全局变量（不需要复杂的LVGL组件）
static lv_obj_t *speedometer_screen;
// 保留主要数据变量

static int current_speed = 0;
static int target_speed = 0;
static int current_gear __attribute__((unused)) = 1;
static int current_rpm = 800;
static int fuel_level = 85;
static bool engine_warning = false;
static bool running = true;

// 颜色定义
static const lv_color_t COLOR_SPEED_ARC = LV_COLOR_MAKE(0x00, 0x80, 0xFF);
static const lv_color_t COLOR_DANGER_ZONE = LV_COLOR_MAKE(0xFF, 0x40, 0x40);
static const lv_color_t COLOR_WARNING_ZONE = LV_COLOR_MAKE(0xFF, 0xA5, 0x00);
static const lv_color_t COLOR_NORMAL_ZONE = LV_COLOR_MAKE(0x00, 0xFF, 0x80);

/**
 * 初始化LVGL显示驱动（完全简化版本）
 */
static void hal_init(void) {
    printf("初始化LVGL显示系统（控制台模式）...\n");
    
    // 创建一个最简单的显示器配置
    lv_display_t * disp = lv_display_create(DISP_HOR_RES, DISP_VER_RES);
    
    if (disp == NULL) {
        printf("⚠️  警告: LVGL显示器创建失败，使用默认配置\n");
    } else {
        printf("✅ LVGL显示系统初始化完成\n");
    }
}

/**
 * 简化的仪表盘初始化（不创建复杂UI）
 */
static void create_speedometer_dial(void) {
    printf("ℹ️  简化模式: 仪表盘数据将通过控制台显示\n");
}

static void create_needle(void) {
    // 简化模式下不需要图形指针
}

static void create_digital_display(void) {
    // 简化模式下不需要图形显示
}

static void create_rpm_gauge(void) {
    // 简化模式下不需要转速表UI
}

static void create_fuel_gauge(void) {
    // 简化模式下不需要燃油表UI
}

static void create_warning_lights(void) {
    // 简化模式下不需要警告灯UI
}

static void update_needle_angle(int speed) {
    // 简化模式下不需要更新指针
    (void)speed; // 避免未使用变量警告
}

/**
 * 更新仪表盘显示（控制台模式）
 */
static void update_dashboard(void) {
    // 平滑速度变化
    if (current_speed < target_speed) {
        current_speed = LV_MIN(current_speed + SPEED_STEP, target_speed);
    } else if (current_speed > target_speed) {
        current_speed = LV_MAX(current_speed - SPEED_STEP, target_speed);
    }
    
    // 根据速度更新转速
    if (current_speed > 0) {
        current_rpm = 800 + (current_speed * 30);
        if (current_rpm > 7000) current_rpm = 7000;
    } else {
        current_rpm = 800;
    }
    
    // 计算档位
    const char* gear;
    if (current_speed == 0) {
        gear = "P";
    } else if (current_speed < 20) {
        gear = "1";
    } else if (current_speed < 40) {
        gear = "2";
    } else if (current_speed < 60) {
        gear = "3";
    } else if (current_speed < 80) {
        gear = "4";
    } else {
        gear = "5";
    }
    
    // 更新警告状态
    if (current_speed > 180 || current_rpm > 6500) {
        engine_warning = true;
    } else {
        engine_warning = false;
    }
    
    // 更新燃油表（模拟消耗）
    if (current_speed > 0) {
        fuel_level -= (current_speed > 100) ? 1 : 0;
        if (fuel_level < 0) fuel_level = 0;
    }
    
    // 控制台输出仪表盘信息
    printf("\r🚗 速度: %3d km/h | 转速: %4d RPM | 档位: %s | 燃油: %3d%% %s", 
           current_speed, current_rpm, gear, fuel_level,
           engine_warning ? "⚠️ " : "✅ ");
    fflush(stdout);
}

/**
 * 模拟速度变化
 */
static void simulate_driving(void) {
    static int direction = 1;
    static int counter = 0;
    
    counter++;
    
    // 每2秒改变一次目标速度
    if (counter % 40 == 0) {
        if (target_speed >= MAX_SPEED - 20) {
            direction = -1;
        } else if (target_speed <= 10) {
            direction = 1;
        }
        
        target_speed += direction * (10 + rand() % 30);
        target_speed = LV_CLAMP(0, target_speed, MAX_SPEED);
        
        printf("目标速度: %d km/h\n", target_speed);
    }
}

/**
 * 键盘事件处理（简化版）
 */
static void keyboard_event_cb(lv_event_t *e) {
    (void)e; // 标记参数为未使用
    
    // 简化版本，使用固定的键值模拟
    static int key_counter = 0;
    key_counter++;
    
    // 模拟不同按键
    switch (key_counter % 4) {
        case 0: // 模拟上箭头
            target_speed = LV_MIN(target_speed + 10, MAX_SPEED);
            printf("加速: %d km/h\n", target_speed);
            break;
        case 1: // 模拟下箭头
            target_speed = LV_MAX(target_speed - 10, 0);
            printf("减速: %d km/h\n", target_speed);
            break;
        case 2: // 模拟R键
            fuel_level = 100;
            printf("加满燃油\n");
            break;
        case 3: // 模拟Q键
            printf("退出程序\n");
            running = false;
            break;
    }
}

/**
 * 创建仪表盘UI（简化版）
 */
static void create_ui(void) {
    // 创建主屏幕（简化模式下不需要复杂的UI组件）
    speedometer_screen = lv_obj_create(NULL);
    
    if (speedometer_screen == NULL) {
        printf("⚠️  警告: 无法创建主屏幕，使用纯控制台模式\n");
        return;
    }
    
    // 设置为当前屏幕
    lv_scr_load(speedometer_screen);
    
    // 在简化模式下，我们只创建最基本的组件用于数据存储
    // 实际显示通过控制台输出
    
    printf("✅ 仪表盘UI初始化完成（简化模式）\n");
}

/**
 * 信号处理函数
 */
static void signal_handler(int sig) {
    printf("\n接收到信号 %d，正在退出...\n", sig);
    running = false;
}

/**
 * 显示使用帮助
 */
static void print_usage(const char *program_name) {
    printf("汽车时速表 - LVGL图形化显示\n");
    printf("用法: %s [选项]\n", program_name);
    printf("选项:\n");
    printf("  -f          全屏模式\n");
    printf("  -s <速度>   初始速度 (0-%d)\n", MAX_SPEED);
    printf("  -h          显示此帮助信息\n");
    printf("\n控制键:\n");
    printf("  ↑         加速\n");
    printf("  ↓         减速\n");
    printf("  R         加满燃油\n");
    printf("  Q/ESC     退出程序\n");
}

/**
 * 主函数
 */
int main(int argc, char *argv[]) {
    int initial_speed = 0;
    bool fullscreen __attribute__((unused)) = false;
    
    // 解析命令行参数
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-h") == 0) {
            print_usage(argv[0]);
            return 0;
        } else if (strcmp(argv[i], "-f") == 0) {
            fullscreen = true;
        } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
            initial_speed = atoi(argv[++i]);
            initial_speed = LV_CLAMP(0, initial_speed, MAX_SPEED);
        } else {
            fprintf(stderr, "错误: 未知参数 '%s'\n", argv[i]);
            print_usage(argv[0]);
            return 1;
        }
    }
    
    // 设置信号处理
    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);
    
    printf("启动汽车仪表盘...\n");
    printf("分辨率: %dx%d\n", DISP_HOR_RES, DISP_VER_RES);
    printf("最大速度: %d km/h\n", MAX_SPEED);
    
    // 初始化LVGL
    lv_init();
    hal_init();
    
    // 设置初始速度
    current_speed = initial_speed;
    target_speed = initial_speed;
    
    // 创建UI
    create_ui();
    
    printf("🎉 汽车仪表盘启动成功！\n");
    printf("📺 运行模式：简化演示（无图形显示）\n");
    printf("⏱️  程序将自动演示速度变化...\n");
    printf("🔧 按Ctrl+C退出程序\n");
    printf("\n=== 仪表盘数据显示 ===\n");
    
    // 主循环
    uint32_t last_tick = lv_tick_get();
    int display_counter = 0;
    while (running) {
        uint32_t current_tick = lv_tick_get();
        lv_tick_inc(current_tick - last_tick);
        last_tick = current_tick;
        
        lv_timer_handler();
        update_dashboard();
        simulate_driving();
        
        // 每2秒在控制台显示一次仪表盘数据
        display_counter++;
        if (display_counter % 40 == 0) { // 50ms * 40 = 2秒
            printf("\r🚗 速度: %3d km/h | 🌀 转速: %4d RPM | ⛽ 燃油: %2d%% | 🔧 档位: ", 
                   current_speed, current_rpm, fuel_level);
            
            // 显示档位
            if (current_speed == 0) printf("P");
            else if (current_speed < 20) printf("1");
            else if (current_speed < 40) printf("2");
            else if (current_speed < 60) printf("3");
            else if (current_speed < 80) printf("4");
            else printf("5");
            
            // 显示警告状态
            if (engine_warning) {
                printf(" | ⚠️  引擎警告");
            }
            
            printf("    "); // 清除可能的剩余字符
            fflush(stdout);
        }
        
        struct timespec ts = {0, UPDATE_PERIOD * 1000000}; // 50ms
        nanosleep(&ts, NULL);
    }
    
    printf("程序退出\n");
    return 0;
}

/*
 * 编译说明:
 * 
 * 基本编译:
 * gcc speedometer.c -o speedometer -llvgl -lSDL2 -lm
 * 
 * 带调试信息:
 * gcc -g -Wall speedometer.c -o speedometer -llvgl -lSDL2 -lm
 * 
 * 依赖库安装:
 * Ubuntu/Debian:
 *   sudo apt-get install libsdl2-dev
 *   # LVGL需要从源码编译或使用包管理器安装
 * 
 * 注意事项:
 * - 需要正确配置LVGL库和SDL2驱动
 * - 确保lv_conf.h配置正确
 * - 可能需要调整包含路径
 */